package com.yanghui.dtracing.core.plugin.interceptor;

import java.lang.reflect.Method;

/**
 * 静态方法拦截器
 */
public interface IStaticMethodAroundInterceptor {

    /**
     * 是否需要拦截，在有些情况下，某个方法需要拦截，但是满足某些条件的请求又不需要拦截，故提供这样一个方法，让用户自行判断
     * @param clz 目标类
     * @param method 目标方法
     * @param allArguments 方法参数列表
     * @return false：不需要拦截 true：需要拦截
     */
    default boolean isIntercept(Class<?> clz, Method method, Object[] allArguments) throws Throwable{
        return true;
    }

    /**
     * 目标方法执行之前执行
     * @param clz 拦截类class对象
     * @param method 拦截方法
     * @param allArguments 方法参数列表
     * @param methodInterceptResult 拦截过程的执行结果
     * @throws Throwable
     */
    default void beforeMethod(Class<?> clz, Method method, Object[] allArguments,MethodInterceptResult methodInterceptResult) throws Throwable{
    }

    /**
     * 目标方法执行完成后执行
     * @param clz 拦截类class对象
     * @param method 拦截方法
     * @param allArguments 方法参数列表
     * @param methodInterceptResult 拦截过程的执行结果
     * @throws Throwable
     */
    default void afterMethod(Class<?> clz, Method method, Object[] allArguments,MethodInterceptResult methodInterceptResult) throws Throwable{
    };

    /**
     * 目标方法抛出异常时执行
     * @param clz 拦截类class对象
     * @param method 拦截方法
     * @param allArguments 方法参数列表
     * @param t 方法抛出的异常
     * @param methodInterceptResult 拦截过程的执行结果
     * @throws Throwable
     */
    default void handleMethodException(Class<?> clz, Method method, Object[] allArguments,Throwable t,MethodInterceptResult methodInterceptResult) throws Throwable{
    };
}
